# 给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。 
# 
#  
#  如果剩余字符少于 k 个，则将剩余字符全部反转。 
#  如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。 
#  
# 
#  
# 
#  示例 1： 
# 
#  
# 输入：s = "abcdefg", k = 2
# 输出："bacdfeg"
#  
# 
#  示例 2： 
# 
#  
# 输入：s = "abcd", k = 2
# 输出："bacd"
#  
# 
#  
# 
#  提示： 
# 
#  
#  1 <= s.length <= 10⁴ 
#  s 仅由小写英文组成 
#  1 <= k <= 10⁴ 
#  
# 
#  Related Topics 双指针 字符串 👍 657 👎 0


# leetcode submit region begin(Prohibit modification and deletion)
class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        n = len(s)
        if n < k:
            return s[::-1]
        elif 2 * k > n >= k:
            return s[:k][::-1] + s[k:]

        left, right, res = k, 2 * k, ''
        while len(res) != n:
            # 2k个字符中翻转前k个
            res += s[left - k:left][::-1]
            res += s[left:right]

            # 如果剩余字符少于 k 个，则将剩余字符全部反转。
            if n - right < k:
                res += s[right:][::-1]
                break
            # 如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样
            elif k <= n - right < 2 * k:
                res += s[right:right + k][::-1] + s[right + k:]
                break
            # 移动双指针
            left, right = right + k, left + k

        return res


# leetcode submit region end(Prohibit modification and deletion)

print(Solution().reverseStr(s="abcd", k=2))
# 测试用例:"abcdefg"
# 			1
# 	测试结果:"ababcdabcdefg"
# 	期望结果:"abcdefg"
